 1.Impala的组件
   
   Impala是一个分布式，大规模并行行处理理(MPP)数据库引擎，它包括多个进程。Impala与Hive类似不是数
据库而是数据分析工具；
   1).impalad
   角色名称为Impala Daemon,是在每个节点上运⾏行行的进程，是Impala的核⼼心组件，进程名是
Impalad;
   作用，负责读写数据⽂文件，接收来⾃自Impala-shell，JDBC,ODBC等的查询请求，与集群其它
Impalad分布式并行行完成查询任务，并将查询结果返回给中⼼心协调者。
  为了保证Impalad进程了解其它Impalad的健康状况，Impalad进程会一直与statestore保持通信。
  Impalad服务由三个模块组成：Query Planner、Query Coordinator和Query Executor，前两个
模块组成前端，负责接收SQL查询请求，解析SQL并转换成执⾏行行计划，交由后端执⾏行
  2).statestored
  statestore监控集群中Impalad的健康状况，并将集群健康信息同步给Impalad,
  statestore进程名为statestored
  3).catalogd
  Impala执行行的SQL语句句引发元数据发⽣生变化时，catalog服务负责把这些元数据的变化同步给其它
Impalad进程(日志验证,监控statestore进程⽇日志)
  catalog服务对应进程名称是catalogd
  由于一个集群需要一个catalogd以及一个statestored进程，⽽而且catalogd进程所有请求都是经过
statestored进程发送，所以官⽅方建议让statestored进程与catalogd进程安排同个节点。
 
 2.Impala的查询
   
   1).Client提交任务
   Client发送⼀一个SQL查询请求到任意⼀一个Impalad节点，会返回⼀一个queryId用于之后的客户端操
作。
   2).生成单机和分布式执行计划
   SQL提交到Impalad节点之后，Analyser依次执⾏行行SQL的词法分析、语法分析、语义分析等操作；
从MySQL元数据库中获取元数据，从HDFS的名称节点中获取数据地址，以得到存储这个查询相关
数据的所有数据节点
   (1).单机执行计划： 根据上一步对SQL语句句的分析，由Planner先生成单机的执行计划，该执行计
划是有PlanNode组成的⼀一棵树，这个过程中也会执⾏行行⼀一些SQL优化，例例如Join顺序改变、谓
词下推等。
   (2).分布式并行物理计划：将单机执行计划转换成分布式并行物理执行计划，物理执行行计划由⼀一
个个的Fragment组成，Fragment之间有数据依赖关系，处理理过程中需要在原有的执⾏行行计划
之上加⼊入一些ExchangeNode和DataStreamSink信息等。
     Fragment ： sql⽣生成的分布式执⾏行行计划的⼀一个⼦子任务；
     DataStreamSink：传输当前的Fragment输出数据到不同的节点
   3).任务调度和分发
    Coordinator将Fragment(⼦子任务)根据数据分区信息发配到不不同的Impalad节点上执行。Impalad
节点接收到执⾏行行Fragment请求交由Executor执行。
   4).Fragment之间的数据依赖
   每一个Fragment的执⾏行行输出通过DataStreamSink发送到下⼀一个Fragment，Fragment运行过程中
不不断向coordinator节点汇报当前运⾏行行状态。
   5).结果汇总
   查询的SQL通常情况下需要有⼀一个单独的Fragment用于结果的汇总，它只在Coordinator节点运
⾏行行，将多个节点的最终执⾏行行结果汇总，转换成ResultSet信息。
   6).获取结果
   客户端调⽤用获取ResultSet的接⼝口，读取查询结果。
   查询计划示例
   以一个SQL例例⼦子来展示查询计划
   SQL语句
   select
t1.n1,
t2.n2,
count(1) as c
from t1 join t2 on t1.id = t2.id
join t3 on t1.id = t3.id
where t3.n3 between ‘a’ and ‘f’
group by t1.n1, t2.n2
order by c desc
limit 100;
   QueryPlanner⽣生成单机的执⾏行行计划
   分析上面的单机执行计划，第一步先去扫描t1表中需要的数据，如果数据文件存储是列式存储我们可以
便便利利的扫描到所需的列列id,n1;接着需要与t2表进⾏行行Join操作，扫描t2表与t1表类似获取到所需数据列
id,n2;t1与t2表进行关联，关联之后再与t3表进行关联，这里Impala会使用谓词下推扫描t3表只取join所
需数据；对group by进⾏行行相应的aggregation操作，最终是排序取出指定数量量的数据返回。
   分布式并⾏行行执⾏行行计划
   所谓的分布式并行化执行计划就是在单机执行计划基础之上结合数据分布式存储的特点，按照任务的计
算要求把单机执⾏行计划拆分为多段⼦子任务，每个子任务都是可以并行执行的。上面的单机执行计划转为
分布式并行执行计划如下图所示：
  分布式执行计划中涉及到多表的Join,Impala会根据表的大小来决定Join的方式，主要有两种分别是Hash
Join与Broadcast Join
  上面分布式执行计划中可以看出T1,T2表大一些，而T3表小一些，所以对于T1与T2的Join Impala选择使
用Hash Join,对于T3表选择使⽤用Broadcast 方式，直接把T3表⼴广播到需要Join的节点上。
  分布式并行计划流程
  1).T1和T2使用Hash join，此时需要按照id的值分别将T1和T2分散到不不同的Impalad进程，但是相同
的id会散列列到相同的Impalad进程，这样每⼀一个Join之后是全部数据的⼀一部分
  2).T1与T2Join之后的结果数据再与T3表进行Join,此时T3表采⽤用Broadcast方式把自己全部数据(id列)
广播到需要的Impala节点上
  3).T1,T2,T3Join之后再根据Group by执行本地的预聚合，每一个节点的预聚合结果只是最终结果的一
部分（不同的节点可能存在相同的group by的值），需要再进行一次全局的聚合。
  4).全局的聚合同样需要并行，则根据聚合列进⾏行Hash分散到不同的节点执行行Merge运算（其实仍然
是一次聚合运算），一般情况下为了了较少数据的⽹网络传输， Impala会选择之前本地聚合节点做全
局聚合工作。
  5).通过全局聚合之后，相同的key只存在于一个节点，然后对于每一个节点进行排序和TopN计算，最
终将每一个全局聚合节点的结果返回给Coordinator进⾏行行合并、排序、limit计算，返回结果给用户.